// 对axios进行封装
import axios from 'axios'
import { ElMessage } from 'element-plus'
import { Check } from '@element-plus/icons-vue'
import { useAuthStore } from '@/stores/authStore.js'

// const HTTP_CODE = {
//   404: '您访问的地址不存在',
//   500: '程序运行异常，请稍后重试',
//   403: '您未被授权访问',
// }

let authStore = null

const instance = axios.create({
  // 在文件中直接定义
  // baseURL: 'http://127.0.0.1:3000/api/v1',
  // 读取环境配置文件
  baseURL: import.meta.env.VITE_API_URL,
})
// 请求拦截器
instance.interceptors.request.use(
  // axios 配置正确可以进行请求发送
  function (config) {
    // console.log(config)

    if (authStore == null) {
      authStore = useAuthStore()
    }
    if (!config.isPublic) {
      config.headers.Authorization = 'Bearer ' + authStore.token
    }

    return config // 才能正确发送请求
  },
  // axios 配置错误,不能进行请求发送
  function (error) {
    ElMessage.error('程序运行错误')
    return Promise.reject(error)
  },
)
// 响应拦截器
instance.interceptors.response.use(
  // 处理HTTP网络状态码 在 2xx 范围的内的成功
  function (response) {
  const { msg, status, data } = response.data
    // 兼容不同后端约定：只要自定义 status < 400 或返回 'success'/true/0/200 即视为成功
    const stat = status
    const statStr = typeof stat === 'string' ? stat.toLowerCase() : ''
    const httpOk = response.status >= 200 && response.status < 300
    const isSuccess =
      httpOk ||
      (typeof stat === 'number' && stat < 400) ||
      stat === 0 ||
      stat === 200 ||
      stat === true ||
      statStr === 'success' ||
      statStr === 'ok'

    if (isSuccess) {
      // 对于非GET请求，如果msg存在，则显示成功消息（绿色勾）
      if (response.config.method.toUpperCase() !== 'GET' && msg) {
        ElMessage({ type: 'success', message: msg, icon: Check })
      }
      return data
    }
    // 其他状态码为错误
    ElMessage.error(msg || '操作失败')
    return Promise.reject(new Error(msg || 'Error'))
  },
  // 处理HTTP网络状态码 超出 2xx 范围的错误
  function (error) {
    // 被取消的请求或路由切换产生的中断不提示
    if (axios.isCancel && axios.isCancel(error)) {
      return Promise.reject(error)
    }
    // 某些浏览器/网络中断错误码
    if (error.code === 'ERR_CANCELED') {
      return Promise.reject(error)
    }
    const resp = error.response
    const cfg = error.config || {}
    const isPublic = cfg.isPublic === true
    // 401 未授权常见于 token 失效，交由路由守卫/登录流程处理，不全局报错
    if (resp && resp.status === 401) {
      // 登录等公共接口（如 /login）的 401 需要提示（账号或密码错误等）
      if (isPublic) {
        ElMessage.error(resp?.data?.msg || '用户名或密码错误')
      }
      return Promise.reject(error)
    }
    // 其它情况尽量展示后端 msg；避免空信息时的噪声
    const msg = resp?.data?.msg || error.message
    if (msg) ElMessage.error(msg)
    return Promise.reject(error)
  },
)

export default instance
